package com.tedu.api;

import org.junit.Test;

/**
 * Java面向对象---不是真的面向对象---八大基础数据类型
 * 创建对象---类【属性，构造器，方法】
 * 8个包装类：针对八大基本数据类型提供对应类【方法基本上互通】
 *           不可改变的类
 * 包装类包位置：java.lang
 * 八大基本数据类型(不是面向对象)    针对八大基本数据类型对应包装类
 *   int                            Integer      继承Number父类【抽象】
 *   long                           Long         继承Number父类【抽象】
 *   double                         Double       继承Number父类【抽象】
 *   short                          Short        继承Number父类【抽象】
 *   float                          Float        继承Number父类【抽象】
 *   byte                           Byte         继承Number父类【抽象】
 *   char                           Character    继承Object父类
 *   boolean                        Boolean      继承Object父类
 */
public class PackingAPI {
    @Test
    public void test(){
        int a=1;  //不是面向对象，通过【反射】
        //创建int类型对象：Integer构造器：引入|直接写
        Integer i=new Integer(a);
        i.toString();
    }
    /**
     * 包装类API
     * xxxValue方法    返回值：对应数据类型
     * 作用：把包装类转换为基本数据类型的方法
     * 测试：6个包装类
     */
    @Test
    public void testxxxValue(){
        Integer i=new Integer(2);//打包：对应类型放入包装类
        i=i.intValue();  //接收：int类型和Integer
        System.out.println(i);
        //测试：其他7个包装类
        String s1="123.123"; //Double
        Double d=new Double(s1);
        d=d.doubleValue();
        System.out.println(d);

        String s2="1" ;  // Byte
        Byte b=new Byte(s2);
        b=b.byteValue();
        System.out.println(b);

        String s3="123.123F" ;   //Float  123.1默认double F只代表类型
        Float f=new Float(s3);
        f=f.floatValue();
        System.out.println(f);

        //包装类构造器：直接传值，也可以使用【字符串传值：Long包装认为L为字符，并不是数值】
        String s4="1234L" ; //  Long 异常NumberFormatException 数值转换异常
        Long l=new Long(5678L);
        l=l.longValue();
        System.out.println(l);

        String s5="true"; //Boolean
        Boolean b1=new Boolean(s5);
        b1=b1.booleanValue();
        System.out.println(b1);

        char s6='a' ;//  Character
        Character c=new Character(s6);
        c=c.charValue();
        System.out.println(c);
    }
    /**
     * 包装类具备静态方法
     * valueOf()    返回值：对应数据类型
     * 作用：把包装类转换为基本数据类型的方法
     */
    @Test
    public void testValueOf(){
        int i=Integer.valueOf(1); //打包拆包一体化
        Boolean.valueOf(true);
        char c=Character.valueOf('1');
        float f=Float.valueOf(1.123F);  //1.123默认 double 编译工具导致 需要明确
    }
    /**
     * 包装类------------Servlet[JavaBean===实体类]
     * public void Person{
     *     Integer id;   //成员
     * }
     *
     * parseXXX()   返回值：对应类型
     *作用：获取到的字符串转换为对应类型
     */
    @Test
    public void testParseXXX(){
        String s="132";//将字符串转换为整型
        int i=Integer.parseInt(s);//区别：解析字符串，转换为正确类型
        //将字符串转换为整型
        int is=Integer.valueOf(s);//区别：存入值，打包拆包获取值
        System.out.println(i);
        System.out.println(i==is);
        //将整型转换为字符串
        String s1=String.valueOf(132);//与包装类用法一致，实现不一致

        //自己测：String s2="456f"   char s3='a'    转出

        String s2="456f";
        float a=Float.parseFloat(s2);
        System.out.println(a);

        char s3='a';
        // Character.  没有针对字符解析  只有它没有.parseXXX
    }
    /**
     * 自动拆装箱
     * JDK1.5之前没有自动拆装箱
     * JKD1.5之后才有自动拆装箱    2004年发售
     */
    @Test
    public void testA(){
        //JDK1.5之前没有自动拆装箱
        Integer in=Integer.valueOf(1);//装箱   可以不写
        int ii=in.intValue();//拆箱            可以不写
        //JKD1.5之后自动拆装箱
        Integer i=1;
        int is=i;
        //编译器帮我们写了拆装箱过程---JVM虚拟机认JDK1.5之前写法
    }
}